/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package chatsystem.design;

import chatsystem.Controller;
import chatsystem.FileNI;
import chatsystem.ListeUtilisateurs;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author morrison
 */
public class ChatGUI implements Observer {

    private JFrame window;
    private ConnectPanel connectionPane;
    private ConversePanel conversationPane;
    private Controller control;
    private ListeUtilisateurs usersList;
    private FileNI fileManager;

    /**
     * Crée un nouveau ChatGUI
     * @param c le controller
     * @param listObs la liste des utilisateurs
     * @param fileManager le FileNI pour gérer les fichiers
     */
    public ChatGUI(Controller c, ListeUtilisateurs listObs, FileNI fileManager) {

        // Pour adopter la charte graphique du système ! :-)
        /*try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
        Logger.getLogger(ChatGUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        Logger.getLogger(ChatGUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        Logger.getLogger(ChatGUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(ChatGUI.class.getName()).log(Level.SEVERE, null, ex);
        }*/

        this.window = new JFrame("Chat System");
        this.window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        this.window.addWindowListener(new WindowListener() {

            public void windowOpened(WindowEvent we) {
            }

            public void windowClosing(WindowEvent we) {
                if (!connectionPane.isShowing()) {
                    int deconnecter = confirmClose();
                    //Si on veut se déconnecter
                    if (deconnecter == 0) {
                        control.disconnect();
                        control.fermeture();
                        System.exit(0);
                    }
                    //Sinon on ne fait rien
                } else {
                    control.fermeture();
                    System.exit(0);
                }
            }

            public void windowClosed(WindowEvent we) {
            }

            public void windowIconified(WindowEvent we) {
            }

            public void windowDeiconified(WindowEvent we) {
            }

            public void windowActivated(WindowEvent we) {
            }

            public void windowDeactivated(WindowEvent we) {
            }
        });
        this.control = c;
        this.usersList = listObs;
        this.fileManager = fileManager;
        this.connectionPane = new ConnectPanel(this.control, this);
        this.conversationPane = new ConversePanel(c, listObs, this, fileManager);
        this.window.add(connectionPane);
        this.window.pack();
        this.window.setVisible(true);
        this.window.setResizable(false);

    }

    /**
     * Fonction qui ouvre une boîte de dialogue pour demander
     * à l'utilisateur de confirmer ou non la fermeture
     * @return choix de l'utilisateur, 0 oui, 1 non
     */
    public int confirmClose() {

        int result = JOptionPane.showConfirmDialog(
                this.conversationPane, // fenêtre parente
                "Voulez-vous vraiment quitter ?", // corps du dialogue
                "Quitter ChatSystem?",// Titre du dialogue
                JOptionPane.YES_NO_OPTION, // type d'options
                JOptionPane.QUESTION_MESSAGE // type du dialogue
                );

        return result;
    }

    /**
     * Remplace le panel de connexion par celui de conversation
     */
    public void setConversationWindow() {

        if (this.conversationPane==null) {
            this.conversationPane = 
                    new ConversePanel(control, usersList, this, fileManager);
        }
        this.window.remove(this.connectionPane);
        this.window.add(this.conversationPane);
        this.window.pack();
    }

    /**
     * Remplace le panel de conversation par celui de connexion
     */
    public void setConnectionWindow() {
        this.window.remove(this.conversationPane);
        this.window.add(this.connectionPane);
        this.window.pack();
    }

    /**
     * Méthode qui appelle addInfo du conversationPane pour ajouter des informations
     * dans la zone de texte prévue à cet effet
     * @param info Informations à ajouter 
     */
    public void addInfo(String info) {
        this.conversationPane.addInfo(info);
    }

    public void update(Observable o, Object arg) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
